/* @Description:utils/libutils.ts @author:378237242@qq.com @date:2023/11/3 */
type isTrueFunction = () => boolean;
// 定义一个函数，用于查找两个数组中相同的元素
const findCommonElement = function <T>(a: T[], b: T[]) {
  // 将数组a转换为Set集合
  const setA = new Set(a);
  // 遍历数组b
  for (let i = 0, length = b.length; i < length; i++) {
    // 获取数组b中的每一个元素
    const element = b[i];
    // 如果集合setA中包含元素b，则返回该元素b在数组a中的索引
    if (setA.has(element)) {
      // 获取数组a中元素b的索引
      const indexInA = a.indexOf(element);
      // 返回元素b在数组a中的索引
      return { element, indexInB: i, indexInA };
    }
  }
  // 如果没有找到，则返回false
  return false;
};
// 判断words数组中是否包含Keywords数组中的元素
const hasCommonElements = function <T>(Keywords: Array<T>, words: Array<T>) {
  return words.some((element) => Keywords.includes(element));
};

// 函数hasFalse接收一个布尔数组，判断数组中是否有false
const hasFalse = function (arrayOfBoolean: boolean[]) {
  // const allTrue = arrayOfFunctions.every((func) => func());
  // 判断数组中是否有false
  const hasFalse = arrayOfBoolean.some((boolean) => boolean === false);
  // 返回布尔值
  return hasFalse;
};
// 定义一个函数，用于排除对象中的私有属性
const excludePrivateProperties = function <T extends Record<string, any>>(
  obj: T,
): Omit<T, keyof T> {
  // 使用Object.entries()方法，将对象转换为键值对数组
  return Object.entries(obj).reduce(
    // 使用reduce()方法，遍历数组，并返回一个新的对象
    (acc, [key, value]) => {
      // 如果key不以"_"开头，则将该键值对添加到新对象中
      if (!key.startsWith("_")) {
        acc[key] = value;
      }
      // 返回新对象
      return acc;
    },
    // 初始值为一个空对象
    {} as Omit<T, keyof T>,
  );
};
export {
  hasCommonElements,
  findCommonElement,
  hasFalse,
  excludePrivateProperties,
};
